package com.bosssoft.permission.centre.api;


import com.bosssoft.permission.centre.entity.Node;
import com.bosssoft.permission.centre.pojo.dto.pcp.RoleDTO;
import com.bosssoft.permission.centre.pojo.dto.pcp.RoleResourceDTO;
import com.bosssoft.permission.centre.pojo.dto.pcp.UserRoleDTO;
import com.bosssoft.permission.centre.pojo.query.RoleQuery;
import com.bosssoft.permission.centre.pojo.query.UserQuery;
import com.bosssoft.permission.centre.pojo.vo.RoleVO;
import com.bosssoft.permission.centre.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @Author: wang
 * @Time: 2022/3/24
 */
@CrossOrigin

@RequestMapping(value = "/permission/centre/v1/role")
public interface RoleApi {


    /**
     * 为角色分配资源
     * @param roleResourceDTO
     * @return Boolean
     */
    @ApiOperation(tags="为多角色分配多资源",value="")
    @PostMapping(value="/assignResource")
    @ResponseBody
    Boolean assignResource(@Valid @RequestBody RoleResourceDTO roleResourceDTO);

    /**
     * 为角色分配用户
     * @param userRoleDTO
     * @return Boolean
     */
    @ApiOperation(tags="为多角色分配多用户",value="")
    @PostMapping(value="/assignUser")
    @ResponseBody
    Boolean assignUser(@Valid @RequestBody UserRoleDTO userRoleDTO);

    /**
     * 通过角色id获取该角色拥有的资源
     * @param roleQuery
     * @return Node
     */
    @ApiOperation(tags="根据roleId查询角色分配的资源",value="")
    @PostMapping(value="/resource")
    @ResponseBody
    List<Node> doQueryResourceByRoleId(@Valid @RequestBody RoleQuery roleQuery);

    /**
     * 通过角色id获取该角色拥有的资源
     * @param
     * @return Node
     */
    @ApiOperation(tags="查询角色表中包含的公司",value="")
    @GetMapping(value="/selectCompany")
    @ResponseBody
    List<Node> selectCompany();

    /**
     * 验证角色名字是否已经存在
     * 若存在，返回 true ;若不存在，返回 false
     * @param roleDTO 角色名
     * @return Node
     */
    @ApiOperation(tags="验证角色是否重复",value="")
    @PostMapping(value="/haveName")
    @ResponseBody
    boolean haveRole(@RequestBody @Valid RoleDTO roleDTO);

    /**
     * @param: 角色DTO
     * @return: 成功则true CommonResponse 应答码和消息统一参考基础框架
     * @see
     * @since
     */

    @ApiOperation(tags="增加角色",value="")
    @PostMapping(value="")
    @ResponseBody
    Boolean add(@RequestBody @Valid RoleDTO roleDTO);


    /**
     * @param:
     * @return:
     * @see
     * @since
     */
    @ApiOperation(tags="删除角色",value="")
    @DeleteMapping(value="")
    @ResponseBody
    Boolean remove(@ApiParam(value = "当前行id", required = true) @RequestParam("id") Long id,
                   @ApiParam(value = "当前行版本", required = true) @RequestParam("version") Long version);

    @ApiOperation(tags="批量删除角色",value="")
    @DeleteMapping(value="/batch")
    @ResponseBody
    Boolean batchRemove(@RequestBody @Valid RoleDTO[] roleDTOS);
    /**
     * @param:
     * @return:
     * @see
     * @since
     */
    @ApiOperation(tags="修改角色",value="")
    @PutMapping(value = "")
    @ResponseBody
    Boolean modify(@RequestBody @Valid RoleDTO roleDTO);


    /**
     * @param: 被拷贝的记录id
     * @return: 拷贝后的完整对象
     * @see
     * @since
     */
    @ApiOperation(tags="拷贝角色",value="/copy")
    @PostMapping(value = "/copy")
    @ResponseBody
    RoleDTO copy(Long id);

    /**
     *  系统框架GlobalControllerResolver 类分析 参数是否 BaseQuery 类型 ，如果是则 拦截调用
     *  <br> PageHelper 分页方法， 并且将返回的page对象放入TheadLocal ，方法返回参数被 ResponseBodyAware拦截
     *  <br> 其判断 返回值的类型 如果是属于分页的请求则 自动将 List<RoleVO> 装入CommonPage
     *  <br> 并且构建统一应答回去 以上改进优化了 请求和应答的方法的编写
     * @param:
     * @return:
     * @see
     * @since
     */

    @ApiOperation(tags="查询角色",value="")
    @GetMapping(value = "")
    @ResponseBody
    List<RoleVO> commonQuery(RoleQuery roleQuery);

    @ApiOperation(tags="查询用户",value="")
    @GetMapping(value = "/commonQueryUser")
    @ResponseBody
    List<UserVO> commonQueryUser(UserQuery userQuery);


    /**
     * @param:
     * @return:
     * @see
     * @since
     */
    @ApiOperation(tags="查询角色 BY ID",value="")
    @GetMapping(value = "{id}")
    @ResponseBody
    RoleVO queryRoleById(@PathVariable("id") Long id);

    @ApiOperation(tags="查询角色 BY ID",value="")
    @GetMapping(value = "/queryUserResource")
    @ResponseBody
    RoleVO queryUserResource(@RequestParam(value = "id",required = true) Long id);
}
